package com.hbjycl.service;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

/**
 * 基础service
 * 
 * @author wxp
 *
 * @datetime 2014年8月20日下午4:20:22
 */
public interface BaseService<T, PK extends Serializable>
{
    /**
     * 根据ID获取实体对象.
     * 
     * @param id
     *            记录ID
     * @return 实体对象
     */
    public T get(PK id);
    
    /**
     * 根据ID获取实体对象.
     * 
     * @param id
     *            记录ID
     * @return 实体对象
     */
    public T load(PK id);
    
    /**
     * 根据ID数组获取实体对象集合.
     * 
     * @param ids
     *            ID对象数组
     * 
     * @return 实体对象集合
     */
    public List<T> get(PK [] ids);
    
    /**
     * 根据属性名和属性值获取实体对象.
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            属性值
     * @return 实体对象
     */
    public T get(String propertyName, Object value);
    
    /**
     * 根据属性名和属性值获取实体对象集合.
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            属性值
     * @return 实体对象集合
     */
    public List<T> getList(String propertyName, Object value);
    
    /**
     * 获取所有实体对象集合.
     * 
     * @return 实体对象集合
     */
    public List<T> getAll();
    
    /**
     * 获取所有实体对象总数.
     * 
     * @return 实体对象总数
     */
    public Long getTotalCount();
    
    /**
     * 根据属性名、修改前后属性值判断在数据库中是否唯一(若新修改的值与原来值相等则直接返回true).
     * 
     * @param propertyName
     *            属性名称
     * @param oldValue
     *            修改前的属性值
     * @param oldValue
     *            修改后的属性值
     * @return boolean
     */
    public boolean isUnique(String propertyName, Object oldValue, Object newValue);
    
    /**
     * 根据属性名判断数据是否已存在.
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            值
     * @return boolean
     */
    public boolean isExist(String propertyName, Object value);
    
    /**
     * 保存实体对象.
     * 
     * @param entity
     *            对象
     * @return ID
     */
    public PK save(T entity);
    
    /**
     * 更新实体对象.
     * 
     * @param entity
     *            对象
     */
    public void update(T entity);
    
    /**
     * 删除实体对象.
     * 
     * @param entity
     *            对象
     * @return
     */
    public void delete(T entity);
    
    /**
     * 根据ID删除实体对象.
     * 
     * @param id
     *            记录ID
     */
    public void delete(PK id);
    
    /**
     * 根据ID数组删除实体对象.
     * 
     * @param ids
     *            ID数组
     */
    public void delete(PK [] ids);
    
    

    
}
